Hulp nodig met een function node in node red.

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
Mijn vraag
ik heb een knop en 3 relays. Ik probeer in node red een function node te maken (in java script) die:
-on button press, checked of een of meerdere van de relays aan staan, zo ja, zet alle relays uit.
-on button press, als alle relays uit staan, zet alle relays aan.

Relevante software en hardware die ik gebruik
Node red
raspberry pi zero w
3.3v 4x relay board
simpele push button (moet er nog een weerstand op aan sluiten)

Wat ik al gevonden of geprobeerd heb
Chat gpt geprobeerd, maar die code geeft telkens "Invalid input: NaN"

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Input: msg.payload (button state)
// Output: msg.payload (command to control relays)

var relay2State = flow.get("relay2") || 0;
var relay3State = flow.get("relay3") || 0;
var relay4State = flow.get("relay4") || 0;

// Convert relay states to numbers
relay2State = Number(relay2State);
relay3State = Number(relay3State);
relay4State = Number(relay4State);

// Check if any of the relays are on
if (relay2State || relay3State || relay4State) {
    // Turn off all relays
    relay2State = 0;
    relay3State = 0;
    relay4State = 0;
} else {
    // Turn on all relays
    relay2State = 1;
    relay3State = 1;
    relay4State = 1;
}

flow.set("relay2", relay2State);
flow.set("relay3", relay3State);
flow.set("relay4", relay4State);

// Prepare the output command
var command = {
    relay2: relay2State,
    relay3: relay3State,
    relay4: relay4State
};

msg.payload = command;
return msg;


iemand een idee hoe ik dit werkend kan krijgen?

Alle reacties


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 05:45

MikeyMan

Vidi, Vici, Veni

Heb je al debug nodes toegevoegd? En 1 input/output tegelijk werkend gekregen?

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
Ja debug nodes genoeg. Ik weet gewoon niet hoe ik de function node die check kan late. Uitvoeren

Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 05:45

MikeyMan

Vidi, Vici, Veni

Je hebt ook geen test ingebouwd nu.

Begin eerst met 1 relay, en breid dan uit.

If(relay2state = 1)
{
Do X
}

Else
{
Do Y
}

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
In totaal heb ik 5 knoppen.
Knop 1 = relay 1, maakt 40ms contact en gaat daarna uit om de pc aan te zetten.
Knop 3 = schakelt relay 2 en zet de monitor 1 aan of uit.
Knop 4 = schakelt relay 3 en zet de monitor 2 aan of uit.
Knop 5 = schakelt relay 4 en zet de monitor 3 aan of uit.

Alles hierboven werkt. Maar knop 2 lukt niet.

Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 05:45

MikeyMan

Vidi, Vici, Veni

Daarom zeg ik, probeer het met een enkele test.

Je zegt nu 'als relaystate2 of relaystate3 of relaystate4'

Maar je specificeert niet wat de test moet zijn.

Je zou hier een logische test aan toe moeten voegen.

'als relaystate2 = 1 of relaystate3 = 1 of relaystate4 = 1'

Of als de som groter is dan 1 oid.

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
MikeyMan schreef op woensdag 7 juni 2023 @ 21:26:
Je hebt ook geen test ingebouwd nu.

Begin eerst met 1 relay, en breid dan uit.

If(relay2state = 1)
{
Do X
}

Else
{
Do Y
}
voor de enkele monitor met 1 knop voor 1 monitor werkt met de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// @ts-nocheck
if (msg.payload == "change") {
    var state = flow.get("button_3") || "off";
    if (state == "off") {
        state = "on";
        node.status({ fill: "green", shape: "dot", text: "Button_3 is ON" });
        msg.payload = 1; // set thois to waht you want to pass on

    }
    else if (state == "on") {
        state = "off";
        node.status({ fill: "red", shape: "dot", text: "Button_3 is OFF" });
        msg.payload = 0; // Set this to what you want to pass on
    }
    flow.set("button_3", state);
    return msg;
}

else if (msg.payload == "reset") {
    flow.set("button_3", "off");
    node.status({ fill: "red", shape: "dot", text: "Button_3 is OFF" });
    msg.payload = 0; // Set this to waht you want to pass on 
    return msg;
}


Afbeeldingslocatie: https://tweakers.net/i/Pcy7l2t0duNDAVH41fw-kf4FOKE=/800x/filters:strip_exif()/f/image/9b2s3cYaP7AXsr9JzMNwxuSC.png?f=fotoalbum_large

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
even ter verduidelijking voor het plaatje.
Bovenin is de werkende knop 1 voor het aanzetten van de pc.
daar onder staat een poging waarmee ik probeer of ik een switch kan maken voor het aan zetten van de pc, of met een relay, of een WOL opdracht.
Onderste deel zijn de 3 werkende knoppen voor de monitoren

middelste is knop twee. Gloval variables is wat ik nu aan het bekijken ben of dat een oplossing is. maar krijg ik ook niet werkend.

[ Voor 22% gewijzigd door spawn666 op 07-06-2023 22:09 ]


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 05:45

MikeyMan

Vidi, Vici, Veni

Ja in dit geval is er wel een logische test aanwezig.

if (state == "off") is een test op uit zijn

if (relay2State || relay3State || relay4State) bevat geen logische test.

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
MikeyMan schreef op woensdag 7 juni 2023 @ 22:09:
Ja in dit geval is er wel een logische test aanwezig.

if (state == "off") is een test op uit zijn

if (relay2State || relay3State || relay4State) bevat geen logische test.
O, de code die ik in het eerste bericht staat werkt niet en komt alleen terug met een error.
Dit is door chatgpt gegenereerd omdat ik het zelf niet kan. Ik heb geen idee hoe ik die code zou moeten aanpassen. Script kennis is echt null

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 30-04 22:28
MikeyMan schreef op woensdag 7 juni 2023 @ 22:09:
Ja in dit geval is er wel een logische test aanwezig.

if (state == "off") is een test op uit zijn

if (relay2State || relay3State || relay4State) bevat geen logische test.
Het is JavaScript; if (relay2State) geeft dus false als de waarde 0 is, en anders true. Die logische test werkt dus gewoon.
De foutmelding in kwestie is NaN; op welk regelnummer is dat volgens de foutmelding, @spawn666 ?

Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 05:45

MikeyMan

Vidi, Vici, Veni

Merethil schreef op donderdag 8 juni 2023 @ 03:46:
[...]


Het is JavaScript; if (relay2State) geeft dus false als de waarde 0 is, en anders true. Die logische test werkt dus gewoon.
De foutmelding in kwestie is NaN; op welk regelnummer is dat volgens de foutmelding, @spawn666 ?
Ok, en nu zetten we er drie achter elkaar. Waar test je dan op?

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 30-04 22:28
MikeyMan schreef op donderdag 8 juni 2023 @ 07:22:
[...]


Ok, en nu zetten we er drie achter elkaar. Waar test je dan op?
Of minstens één van die drie true is (dus een waarde boven getal 0). Dat is het idee van de || (or) tussen de values.

De hele IF wordt dus true als één of meer van de variabelen value >0 hebben. Anders is de IF false.

[ Voor 14% gewijzigd door Merethil op 08-06-2023 07:48 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 03-05 17:34

Janoz

Moderator Devschuur®

!litemod

Wordt op de andere plekken waar je de knoppen bedient ook de state in de flow aangepast? Ik zie het alleen in regel 4,5,6 en 26,27,28. Als die state niet aangepast word bij het los aansturen van de relay's dan gaat deze functie uit van volledig verkeerde state.


Node-red is een event gebaseerde manier van programmeren. Nadeel daarvan is dat state van dingen die niet bij het event horen soms wat lastiger zijn.

Extra tip: Geef je nodes namen!

[ Voor 4% gewijzigd door Janoz op 08-06-2023 10:01 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 05:45

MikeyMan

Vidi, Vici, Veni

Merethil schreef op donderdag 8 juni 2023 @ 07:47:
[...]


Of minstens één van die drie true is (dus een waarde boven getal 0). Dat is het idee van de || (or) tussen de values.

De hele IF wordt dus true als één of meer van de variabelen value >0 hebben. Anders is de IF false.
Ok, helder. Vind het niet zo'n overzichtelijke manier van werken, maar if it works it works :)

Acties:
  • +1 Henk 'm!

Anoniem: 80910

MikeyMan schreef op donderdag 8 juni 2023 @ 10:06:
[...]


Ok, helder. Vind het niet zo'n overzichtelijke manier van werken, maar if it works it works :)
Wellicht is deze functie dan makkelijker te lezen:
https://www.w3schools.com...e=tryjsref_includes_array

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
MikeyMan schreef op woensdag 7 juni 2023 @ 17:28:
Heb je al debug nodes toegevoegd? En 1 input/output tegelijk werkend gekregen?
ja overal zitten debug nodes.
Van wat ik kan zien accepteert de gpio-out node de output niet uit de function node.

waarde die uit de function node komt is {"relay2":0,"relay3":0,"relay4":0}

Ook valt het mij op dat bij het meerdere keren indrukken van button 2 de aan het uit gewoon verspringt. Er vind nog geen check uit of er iets aan staat of uit.

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
Janoz schreef op donderdag 8 juni 2023 @ 10:00:
Wordt op de andere plekken waar je de knoppen bedient ook de state in de flow aangepast? Ik zie het alleen in regel 4,5,6 en 26,27,28. Als die state niet aangepast word bij het los aansturen van de relay's dan gaat deze functie uit van volledig verkeerde state.


Node-red is een event gebaseerde manier van programmeren. Nadeel daarvan is dat state van dingen die niet bij het event horen soms wat lastiger zijn.

Extra tip: Geef je nodes namen!
is er een manier dat ik de state kan opvragen en opslaan ergens? misschien is het iets wat uitgelezen kan worden als de staat gechecked moet worden.

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
Extra tip: Geef je nodes namen!
Maar ik heb alles een naam gegeven.

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
MikeyMan schreef op woensdag 7 juni 2023 @ 22:09:
Ja in dit geval is er wel een logische test aanwezig.

if (state == "off") is een test op uit zijn

if (relay2State || relay3State || relay4State) bevat geen logische test.
geen idee hoe dit er uit zou moeten zien.

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
Merethil schreef op donderdag 8 juni 2023 @ 07:47:
[...]


Of minstens één van die drie true is (dus een waarde boven getal 0). Dat is het idee van de || (or) tussen de values.

De hele IF wordt dus true als één of meer van de variabelen value >0 hebben. Anders is de IF false.
kun je mij een voorbeeld geven want ik kan wel luk raak IF's gaan toevoegen maar zonder allen karakters eromheen werkt het niet.
Ik heb echt geen flauw idee met betrekking tot coding. |:(

Acties:
  • 0 Henk 'm!

  • spawn666
  • Registratie: April 2002
  • Laatst online: 02-05 14:04
Merethil schreef op donderdag 8 juni 2023 @ 03:46:
[...]


Het is JavaScript; if (relay2State) geeft dus false als de waarde 0 is, en anders true. Die logische test werkt dus gewoon.
De foutmelding in kwestie is NaN; op welk regelnummer is dat volgens de foutmelding, @spawn666 ?
de NaN melding komt uit de gpio out. Die kan blijkbaar niet omgaan met de {"relay2":0,"relay3":0,"relay4":0} output van de function.

Daarnaast vind de controle van de staat wat aan staat en uit staat niet plaats.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 03-05 17:34

Janoz

Moderator Devschuur®

!litemod

spawn666 schreef op vrijdag 9 juni 2023 @ 17:31:
[...]


is er een manier dat ik de state kan opvragen en opslaan ergens? misschien is het iets wat uitgelezen kan worden als de staat gechecked moet worden.
Nou, in principe doe je dat. Die regels met flow.set en flow.get bewaren state in de flow. Die moet je natuurlijk wel bijhouden om te zorgen dat relaystate overeenkomt met de daadwerkelijke state van die relay.

Ik krijg een beetje het vermoeden dat je die relaystate1 t/m3 alleen hier zet. Die veranderen dus niet mee wanneer je op een andere manier je relays verandert.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1