Vinnerliste
Populært innhold
Viser innholdet med mest poeng fra 13. sep. 2023 i alle områder
-
Fant feilen. Er på linux, og det var i settings.ini filen. I backup'en var denne satt gServerAddressBind=192.168.0.51 fjernet den og det meste kom opp igjen. Hva den gjør og hvorfor den var det vet jeg ikke.2 poeng
-
1 poeng
-
Jeg bruker et par virtuelle devicer og enkle events som gjør dette for dørene ut til terrassen. Når en dør åpnes, skrus devicen på. Når døren åpnes på nytt, så skrus den virtuelle devicen på igjen, men da betyr det jo ingenting for den er på allerede. Devicene settes til off kl. 04:00. Så sjekkes det kl. 22:15 om de virtuelle devicene har vært skrudd på, og hvis det, så send melding. 🙂1 poeng
-
1 poeng
-
Introduksjon Denne guiden gir ikke alle detaljer, men prøver å gi generelle retningslinjer som kan forenkle prosessen ved å bygge noe tilsvarende. Verktøy Kapp-/Gjærsag Drill 35mm bor (sylinderbor/ hengselbor) https://www.biltema.no/verktoy/bor/trebor/sylinderbor-2000016848 https://www.byggmakker.no/produkt/hengselbor-35mm-8x60-2-skjaer/7311662131784 “Tapetkniv” Mal for hullboring (skrog/dør) Hurtigtvinge Linjal/vinkel (stål/alu for kutting av sokkellist) Vinkelsliper 3d printer Deleliste Aktuator (150mm, 90mm/s) https://www.aliexpress.com/item/4000849922418.html?spm=a2g0o.order_list.order_list_main.14.21ef1802NtTDy9 Motorstyring https://www.aliexpress.com/item/4000002701244.html?spm=a2g0o.order_list.order_list_main.19.21ef1802NtTDy9 Hengsler (uten demping) https://www.clasohlson.com/no/p/40-7887 Monteringsbånd https://www.biltema.no/bygg/byggbeslag/hullband/monteringsband-galvanisert-2000017277 Limit switch https://artigereliv.no/produkt/elektronikk/mikrokontrollere/sensorer-og-tilbehor/3d-printer-limit-switch D1 mini (esp8266) Stepdown https://www.aliexpress.com/item/1005003140077648.html?spm=a2g0o.productlist.main.1.598b2b06DMKN7g&algo_pvid=3f583756-e566-460d-a392-336417dbe220&algo_exp_id=3f583756-e566-460d-a392-336417dbe220-0&pdp_npi=4%40dis%21USD%211.59%211.59%21%21%211.59%21%21%402103135816942659190861478edc71%2112000024308653563%21sea%21NO%21182151077%21S&curPageLogUid=J0TC7f4ZOn7G Strømforsyning https://www.aliexpress.com/item/32805093211.html?spm=a2g0o.order_list.order_list_main.129.24311802Qmk128 Passe lang M6 bolt til å feste aktuator (2stk) M6 Skiver M6 låsemutter Ståltråd https://www.biltema.no/fritid/hage/gjerde/staltrader/staltrad-50-m-2000041228 Div ledninger Små skruer til å feste aktuatorbrakett i dør Bygge rammen Mockup av rammen. Jeg bygget rammen min av terrassebord jeg hadde liggende (28x120), men akkurat hva det er så lenge det passer underkjøkkenbenken er ikke så viktig. Bredden innvendig bør være støvsuger + rundt 3cm klaring på hver side av den innvendig (husk bredde på aktuator og klaring fra denne mot ramme kan være rundt 4cm). Dybden på rammen kan være noe kortere enn totaldybde, da det kan justeres med overliggeren som døra festes i. Rundt 5mm kan være greit, men dette må vurderes individuelt. Senterpunkt i rammen vil da være mellom den ene siden, og mot aktuator på andre siden. Jeg kuttet også hull i bakkant til docking, for å få litt ekstra dybde. Jeg boret også hull til en guide-pinne som sitter i veggen (type treplugg som kommer med flatpakkede skap o.l.). Dette for å ha et fast punkt å jobbe fra (måtte ha rammen ut flere ganger for å måle). Toppen av overliggeren bør være så nært undersiden av benk som mulig, for at dør ikke skal komme i konflikt med rammen under åpning. Jeg endte opp med å shimme den opp fra rammen, for å redusere avstanden mest mulig. Hengsler Bor hull til hengsle ved bruk av mal i dør og overligger (holdes fast med hurtigtvinge). Modifiser hengsle ved å ta bort fjær, slik at den glir uten motstand. Bor ut aksling den er festet på ihht bilde. Aktuator Aktuator festes med noe klaring mot gulv, horisontalt fra dør til ramme. Klaring mellom dør og ramme er avstanden til hengsle, og må tas med i beregningen når overligger monteres mtp dybde under benk. Rundt 4-5mm opp fra gulvet burde være en god plassering. Forsenket M6 bolt med skive fra utside, slik at envelopen ikke er større enn rammen. Bolten er så festet med skive og låsemutter på innsiden, og så shimmet ut til riktig avstand for montering av aktuator. Brakett med M6 bolt, merk ingen mutter. Dette er for mekanisk override, ved at sokkel ved siden av ramme kan tas av, og bold fjernes ved funksjonssvikt. Legg merke til avrundet hjørne i bakgrunn for tilgang til bolt fra utsiden. Bolt er kuttet i lengden, slik at den skal være enklest mulig å få ut. Kutte sokkellist For å kutte sokkellisten lagde jeg først et dypt kutt med en tapetkniv på fronten (bruk linjal/vinkel med hurtigtvinge for å unngå feilskjær), deretter brukt jeg en gjærsag med dybdestopp for å kutte resten fra baksiden. Dette sørger for kutte bort minst mulig materiale, for best mulig sammenstilling. Kode // constants won't change. They're used here to set pin numbers: const int pushPin = 2; // D4 -> switch, motor const int overRidePin = 14; // D5 -> switch, override const int openPin = 16; // D0 -> 3, BTS7960 const int shutPin = 15; // D8 -> 4, BTS7960 // Variables will change: int openState = LOW; // int shutState = HIGH; // int pushState; // the current reading from the input pin int lastPushState = LOW; // the previous reading from the input pin // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 100; // (50) the debounce time; increase if the output flickers void setup() { Serial.begin(115200); Serial.println("setup"); pinMode(pushPin, INPUT); pinMode(overRidePin, INPUT); pinMode(openPin, OUTPUT); pinMode(shutPin, OUTPUT); // set initial state digitalWrite(openPin, openState); digitalWrite(shutPin, shutState); } void loop() { // read the state of the switch into a local variable: int reading = digitalRead(pushPin); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastPushState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (reading != pushState) { pushState = reading; // only toggle the door if the new button state is HIGH if (pushState == HIGH) { // open gate: digitalWrite(openPin, LOW); digitalWrite(shutPin, HIGH); Serial.println("shut gate"); } else { // shut gate: digitalWrite(shutPin, LOW); digitalWrite(openPin, HIGH); Serial.println("shut gate"); } } } // save the reading. Next time through the loop, it'll be the lastButtonState: lastPushState = reading; } Elektronikk Koblingsskjema til elektronikk Koble sammen og last opp kode til D1 mini. Bryter er festet med ståltråd i monteringsbånd, for å enkelt kunne justere denne til støvsugerpossisjon når den står i docken. Etterord Tatt i betraktning at det begynner å bli ganske vanlig med store dockingstasjoner for støvsugere med automatisk tømming og fylling av vann. Kan det være en ide å lage en slik garasje der man har et høyskap, slik at man kan få plass til å hente ut disse dunkene på en enkel måte. Koden som styrer døra er ganske enkel, så om det skulle dukke opp en oppgraderinger med MQTT autodiscovery, ville det vært veldig praktisk 😉. Vedlegg: - Holder til ESP, stepdown og motorstyring - Brakett til dør - Mal til hengsle-skrog - Mal til hengsle-dør Hengslemal skrog.stl Hengslemal dør.stl Motor festbrakett.stl Holder.stl edit: oppdatert aktuator spec edit2: oppdatert koblingsskjema1 poeng
-
Etter å ha brutt ned mitt esp kontrollerte pepperkakehus var jeg i prosjekt vakuum etter jul, noe som utløste ideen om å koble min NAD C320BEE forsterker på nett for styring fra Home Assistant. Første tanken var en IR fra en Raspberry som står som streaming node i stereoanlegget men fikk lyst å grave litt dypere. NAD har en IR in, IR ut og 12v trigger 3.5mm kontakt som jeg måtte utforske litt. Med litt googling fant jeg krets diagrammet for forsterkeren og det viser seg at det er relativt enkelt å koble seg på. IR in/ut er koblet via transistor drivere, forventer 5v men fungerer på 3.3v IR ut gir ett rått modulert IR signal, dvs den videresender alle IR signaler selv om de ikke er NAD (SR5 for C320BEE) Så, etter litt testing med en WeMos D1 mini (esp8266) ender jeg opp med en enkel kobling. En enkel spenningsdeler på 12v for å detektere power status på forsterkeren og en pulldown på input from IR out (motstandene er basert på hva jeg hadde i skuffen..). Dermed var det klart for å sette opp i ESPHome/Home Assistant: IR bruker remote_receiver/remote_transmitter i ESPHome Trigger 12v kobles på en binary_sensor Kobler mot MQTT for direkte kontroll (utenom HA) Definerer fjernkontroll funksjoner som button's i ESPHome, fjernkontrolleren er en tilfeldig jeg hadde liggende med NEC encoding, adresse 0x1000 Jeg liker at stereo anlegget virker selv om hjemme serveren er nede så jeg koder inn "on_nec" lokalt i remote_receiver for direkte kontroll. Definerer en power switch (template switch) og mute for bruk i HA samt en template select for å velge forsterker input. Styring av andre enheter Siden jeg publiserer alle NEC IR koder til MQTT kan jeg fange opp andre fjernkontrollere og gjøre aksjoner i Home Assistant, f.eks styring av en media_player (MPD i mitt tilfelle). automation: - alias: Hifi - play trigger: - platform: mqtt topic: ir/nec/0x1000 encoding: utf-8 payload: 40800 value_template: "{{ value_json.command }}" condition: [] action: - service: media_player.media_play data: {} target: entity_id: media_player.media_system mode: single - alias: Hifi - pause trigger: - platform: mqtt topic: ir/nec/0x1000 encoding: utf-8 payload: 40290 value_template: "{{ value_json.command }}" Notater om IR koder Jeg hadde mistet NAD fjernkontrollen for mange år siden men jeg fant ut at den bruke SR5 i lirc som ser noe slikt ut: begin remote name NAD_SR5 bits 16 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 header 9060 4418 one 644 1600 zero 644 478 ptrail 644 repeat 9059 2172 pre_data_bits 16 pre_data 0xE13E gap 107847 toggle_bit 0 begin codes KEY_POWER_ON 0xA45B KEY_POWER_OFF 0x13EC KEY_CD 0xA15E KEY_TUNER 0xBB44 KEY_AUX 0xD926 KEY_VIDEO 0x43BC KEY_DISC 0x916E KEY_MUTE 0x29D6 KEY_VOLUMEUP 0x11EE KEY_VOLUMEDOWN 0x31CE end codes end remote Forsterkerens NEC IR addresse er gitt i pre_data som 0xE13E, ihht ESPHome NEC må denne bit-reverseres så forsterkerens adressen er 0x07C87. Kommandoene gitt i lirc er som de sendes, dvs 8b inverted + 8b. Dette må bit reverseres for å få ESPHome NEC koden. Dermed kan vi konvertere lirc IR filer direkte til ESPHome NEC. Eksempel: Videre Jeg ser videre på muligheten for å få opp i2s (audio) for å gjøre forsterkeren til en streaming enhet, litt usikker på om lydkvaliteten blir ok, må kanskje skifte til en ESP32 for å kunne håndtere multirom streaming (Snapcast) Prosjektet kan egentlig bygges inn i forsterkeren (garantien løp ut for noen år siden, ca 20?), den har 5v "alltid på" for sin innebygde IR kontroller, spørsmål om ev. støy fra ESP. ESPHome YAML esphome: name: "nad-c320bee" esp8266: board: esp01_1m # Enable logging logger: # Enable Home Assistant API api: ota: wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "nad-c320bee" password: "XXXXXXXXXX" captive_portal: # Should use hassio mqtt server mqtt: topic_prefix: esp discovery: false broker: 192.168.0.99 username: yyyyy password: xxxxxxxxxx id: mqtt_esphome # Check 12v trigger binary_sensor: - platform: gpio name: "NAD Power State" id: nad_power_state pin: number: GPIO14 # D5 device_class: power internal: false # Note power off/on resets the mute state on_state: - switch.template.publish: id: nad_mute state: OFF # Direct from NAD IR-Output remote_receiver: pin: number: GPIO12 # D6 inverted: False dump: all tolerance: 50% filter: 50us idle: 10ms # Publish all/most NEC parsed commands to MQTT on_nec: then: - if: condition: lambda: |- if(x.address != 0x1000) return true; switch(x.command) { // Volume down case 0xbf40: id(nad_volumedown).press(); return false; // Volume up case 0xe01f: id(nad_volumeup).press(); return false; // Volume mute case 0xe718: id(nad_mute).toggle(); return false; // Power toggle case 0xff00: id(nad_power).toggle(); return true; // Channel up case 0xef10: { auto call = id(nad_input_source).make_call(); call.select_next(true); call.perform(); return false; } // Channel down case 0xf00f: { auto call = id(nad_input_source).make_call(); call.select_previous(true); call.perform(); return false; } // Pass rest on default: break; } return true; then: - mqtt.publish_json: topic: !lambda |- static char topic[16]; sprintf(topic, "ir/nec/0x%x", x.address); return topic; payload: !lambda |- root["address"] = x.address; root["command"] = x.command; # Direct to NAD IR-Input remote_transmitter: carrier_duty_percent: 50% pin: number: GPIO13 # D7 switch: - platform: template name: "NAD Amplifier Power" id: nad_power icon: "mdi:audio-video" lambda: |- return id(nad_power_state).state; turn_on_action: - button.press: nad_cmd_poweron turn_off_action: - button.press: nad_cmd_poweroff optimistic: false assumed_state: false - platform: template name: "NAD Volume Mute" id: nad_mute icon: "mdi:audio-video" turn_on_action: - button.press: nad_cmd_mute turn_off_action: - button.press: nad_cmd_mute optimistic: true assumed_state: false # XXX: Tape monitor (1) is not a toggle as rest... # it will co-exist with others select: - platform: template name: "NAD Input Source" id: nad_input_source icon: "mdi:audio-video" options: #- tape1 - tape2 - tuner - aux - video - cd - disc set_action: - lambda: |- static const std::map<std::string, template_::TemplateButton *> input = { {"tape1", nad_cmd_tape1}, {"tape2", nad_cmd_tape2}, {"tuner", nad_cmd_tuner}, {"aux", nad_cmd_aux}, {"video", nad_cmd_video}, {"cd", nad_cmd_cd}, {"disc", nad_cmd_disc}, }; // Delay needed to separate from earler (power on) commands delayMicroseconds(100000); if(auto it{ input.find(x) }; it != std::end(input)) { const auto&[key, value] {*it}; value->press(); } else { ESP_LOGD("main", "unknown source for amplifier input select [%s]", x.c_str()); } restore_value: true optimistic: true button: # # Address: 0x7C87 is 0111 1100 1000 0111 # Reversed: 1110 0001 0011 1110 -> 0xE13E which is the address Lirc uses for SR5 # # Command: 0x6B94 is 0100 1011 1001 0100 -> is inverted cmd + cmd # 6B => 0110 1011 # 94 => 1001 0100 # Reversed: 0010 1001 1101 0110 -> 0x29D6 which is the command Lirc uses for SR5 # # # mosquitto_pub -h stuepi -u sysop -P xs2mf4ao -t esp/button/nad_mute/command -m 'PRESS' # # Commands: Tuner, Aux, Video, CD, Disc (DD/9B/C2/85/89) # Tape Monitor 1, Tape 2 (8D/91) # Vol up/down, mute (88/8C/94) # Power on/off (25/C8) # - platform: template name: "NAD Select Tuner" id: nad_cmd_tuner on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x22DD internal: true - platform: template name: "NAD Select AUX" id: nad_cmd_aux on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x649b internal: true - platform: template name: "NAD Select VIDEO" id: nad_cmd_video on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x3dc2 internal: true - platform: template name: "NAD Select CD" id: nad_cmd_cd on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x7a85 internal: true - platform: template name: "NAD Select DISC" id: nad_cmd_disc on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x7689 internal: true - platform: template name: "NAD Select Tape Monitor 1" id: nad_cmd_tape1 on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x728d internal: true - platform: template name: "NAD Select Tape 2" id: nad_cmd_tape2 on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x6e91 internal: true - platform: template name: "NAD Volume up" id: nad_volumeup on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x7788 - platform: template name: "NAD Volume down" id: nad_volumedown on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x738c - platform: template name: "NAD Mute" id: nad_cmd_mute on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x6B94 internal: true - platform: template name: "NAD Power on" id: nad_cmd_poweron on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0xda25 internal: true - platform: template name: "NAD Power off" id: nad_cmd_poweroff on_press: - remote_transmitter.transmit_nec: address: 0x7C87 command: 0x37c8 internal: true Home assistant media player media_player: # # Implementation of NAD amplifier # - platform: media_player_template media_players: nad_amplifier: friendly_name: NAD Amplifier device_class: receiver # value_template: "{{ states('switch.nad_amplifier_power') }}" <-- XXX: test this value_template: > {% if is_state("switch.nad_amplifier_power", "on") -%} on {%- else -%} off {%- endif %} #current_is_muted_template: "{{ states('switch.nad_volume_mute') }}" <-- XXX: test this current_is_muted_template: > {% if is_state("switch.nad_volume_mute", "on") -%} True {%- else -%} False {%- endif %} current_source_template: "{{ states('select.nad_input_source') }}" # Note tape1 is a "tape monitor" and coexists with the others inputs: tape2: service: select.select_option data: option: tape2 target: entity_id: select.nad_input_source tuner: service: select.select_option data: option: tuner target: entity_id: select.nad_input_source aux: service: select.select_option data: option: aux target: entity_id: select.nad_input_source video: service: select.select_option data: option: video target: entity_id: select.nad_input_source cd: service: select.select_option data: option: cd target: entity_id: select.nad_input_source disc: service: select.select_option data: option: disc target: entity_id: select.nad_input_source turn_on: service: switch.turn_on target: entity_id: switch.nad_amplifier_power turn_off: service: switch.turn_off target: entity_id: switch.nad_amplifier_power mute: service: switch.toggle target: entity_id: switch.nad_volume_mute volume_up: service: button.press target: entity_id: button.nad_volume_up volume_down: service: button.press target: entity_id: button.nad_volume_down1 poeng
Vinnerlisten er satt til Oslo/GMT+01:00